import { name } from './src/es6';
namespace a {
  interface PlainObject {
    [propName: string]: number;
  }
  let obj = {
    x: 1,
    y: 2,
    z: 3
  }
  // 接口的readonly 接口是对象的描述
  interface Circle {
    readonly PI: number;
    radius: number;
  }
  let circle: Circle = {
    radius: 2,
    PI: 3.14
  }
  // circle.PI = 23 是一个只读属性
  // 接口还可以用来约束函数
  interface Discount {
    // 表示这个函数参数是number类型，并且返回值是number
    (price: number): number
  }
  let cost: Discount = function (price: number): number {
    // 优惠打8折
    return price * .8
  }
  console.log(cost(10));
  // 可索引接口
  // 是用来对数组和对象进行约束
  interface UserInterface {
    [index: number]: string // 用来约束数组和对象的key必须是数字，值必须是字符串
  }
  let arr: UserInterface = ['1', '2']
  let obj2: UserInterface = {
    0: '1',
    1: 'v'
  }
  // type interface的区别
  namespace b {
    // 类接口，可以用接口来·装饰类·，学ts的核心就是两个重要点: 接口+泛型
    interface Speakable {
      name: string;
      speak(word: string): void;
    }
    // 类实现接口
    class Dog implements Speakable {
      name: string;
      speak(word: string): void {

      }
    }
    class Animal {
      constructor(public name: string) {

      }
    }
    // 约束构造函数，使用new来约束
    interface WithNameClass {
      new(name: string): Animal
    }
    function createAnimal(clazz: WithNameClass, name: string) {
      return new clazz(name)
    }
    let p = createAnimal(Animal,'leichao')
  }

}